// com/nb/util/CsvExportUtil.java
package com.nb.result;

import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class CsvExportUtil {

    // 日期格式化器
    private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    /**
     * 导出列表为CSV
     * @param outputStream 输出流
     * @param headers 表头
     * @param data 数据列表
     * @param <T> 数据类型
     * @throws IOException IO异常
     */
    public static <T> void export(OutputStream outputStream, String[] headers, List<T> data) throws IOException {
        try (OutputStreamWriter writer = new OutputStreamWriter(outputStream, StandardCharsets.UTF_8)) {
            // 写入BOM头，解决Excel中文乱码
            writer.write('\ufeff');

            // 写入表头
            writer.write(String.join(",", headers) + "\n");

            // 写入数据
            for (T row : data) {
                String line = convertRowToCsv(row);
                writer.write(line + "\n");
            }
            writer.flush();
        }
    }

    /**
     * 将对象转换为CSV行（处理特殊字符）
     */
    private static String convertRowToCsv(Object obj) {
        // 修正：使用Arrays.stream()将Field数组转换为流
        return Arrays.stream(obj.getClass().getDeclaredFields())
                .map(field -> {
                    try {
                        field.setAccessible(true);
                        Object value = field.get(obj);
                        // 恢复完整逻辑：处理null、日期类型和特殊字符
                        if (value == null) {
                            return "";
                        }
                        // 处理日期类型
                        if (value instanceof LocalDateTime) {
                            return DATE_FORMATTER.format((LocalDateTime) value);
                        }
                        // 处理包含逗号或引号的字符串
                        String strValue = value.toString();
                        if (strValue.contains(",") || strValue.contains("\"")) {
                            return "\"" + strValue.replace("\"", "\"\"") + "\"";
                        }
                        return strValue; // 基本类型直接返回字符串
                    } catch (IllegalAccessException e) {
                        return "";
                    }
                })
                .collect(Collectors.joining(","));
    }
}